const acorn = require("acorn");

// 我们把插件放到不同的模块中，然后通过 map 来维护
const syntaxPlugins = {
    'literal': require('./plugins/literal'),
    'guangKeyword': require('./plugins/guangKeyword')
}

// 实现 parse 的时候，先把 options 做合并，之后根据 plugin 来依此启用不同的插件

const defaultOptions = {
    plugins: []
}

function parse(code, options) {
    const resolvedOptions = Object.assign({}, defaultOptions, options);
    const newParser = resolvedOptions.plugins.reduce((Parser, pluginName) => {
        let plugin = syntaxPlugins[pluginName]
        return plugin ? Parser.extend(plugin) : Parser;
    }, acorn.Parser);

    // 指定 locations 为 true，也就是保留 AST 在源码中的位置信息，这个在生成 sourcemap 的时候会用的。
    return newParser.parse(code, {
        locations: true
    });
}

module.exports = {
    parse
}